home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Visual Basic Source Code
/
Visual Basic Source Code.iso
/
vbsource
/
ontop
/
on_top.txt
< prev
Wrap
Text File
|
1993-01-27
|
5KB
|
152 lines
On Top
This is a Visual Basic 2.0 project (should work in VB 1.0 but I didn't try it).
The project demonstrates a way of keeping one form out of a group of forms on top
while minimizing "flashing" and without changing the focus.
The project keeps Form3 on top of Form1. This is accomplished by using the
ShowWindow API call and "shadow" or "backing" forms. The backing forms
are dummy forms that have the following property values:
No Caption
No border
No Control Box (system menu)
No Minimize button
No Maximize button
When a backing form is displayed by itself on the screen it looks like a white
hole in the display (I assumed the default background color is white in this case).
The backing forms track the position of another form and are always positioned
under another form (or in back of another form). The purpose of the backing form
is to trap the move messages of the top form. It does this because anytime the top
form is moved, part of the bottom form is exposed and then we get a PAINT MESSAGE.
This has the effect of converting the move message of the top form to a paint
event in the bottom form. Of course the backing form immediatley sizes and moves
it self to stay perfectly under the top form so that it can't be seen!
This project has 4 forms and one module (*.BAS) file. The forms are called
Form1.FRM
Form2.FRM
Form3.FRM
Form4.FRM
Module1.BAS
To re-create the project, make four forms. Set the property valus of Form2.FRM
and Form4.FRM as shown above for the "backing" forms. Copy the text to the
appropriate events in the forms and *.bas file and go for it! Anytime you place
Form1 on top of Form3, Form3 will come to the top .. but Form1 will still have
the focus. Have fun!
One note, the extra backing form (I think it is Form2) is a remnant of another
experiment. This experiment made the position of two forms track. If you are
interested let me know. It only takes a few lines of code.
Jon Sigler
71631,776
*********************** Form1 ****************************
Option Explicit
Sub Form_GotFocus ()
Dim an_error As Integer
Form4.Top = form1.Top
Form4.Left = form1.Left
Form4.Width = form1.Width
Form4.Height = form1.Height
If Intersection(form3, form1) Then
an_error = ShowWindow(form3.hWnd, SW_SHOWNA)
End If
End Sub
Sub Form_Load ()
Form4.Show
Form2.Show
form3.Show
End Sub
Sub Form_Paint ()
Cls
Print "This form"
Print "will not"
Print "stay on"
Print "of Form3."
End Sub
Sub Form_Resize ()
Dim an_error As Integer
Form4.Top = form1.Top
Form4.Left = form1.Left
Form4.Width = form1.Width
Form4.Height = form1.Height
If Intersection(form3, form1) Then
an_error = ShowWindow(form3.hWnd, SW_SHOWNA)
End If
End Sub
*********************** Form2 ****************************
Option Explicit
Sub Form_Paint ()
Dim an_error As Integer
Form2.Top = form3.Top
Form2.Left = form3.Left
Form2.Width = form3.Width
Form2.Height = form3.Height
If Intersection(form3, form1) Then
an_error = ShowWindow(form3.hWnd, SW_SHOWNA)
End If
End Sub
*********************** Form3 ****************************
Option Explicit
Sub Form_Paint ()
Cls
Print "This form"
Print "will always"
Print "stay on top"
Print "of Form1."
End Sub
*********************** Form4 ****************************
Option Explicit
Sub Form_Paint ()
Dim an_error As Integer
Form4.Top = form1.Top
Form4.Left = form1.Left
Form4.Width = form1.Width
Form4.Height = form1.Height
If Intersection(form3, form1) Then
an_error = ShowWindow(form3.hWnd, SW_SHOWNA)
End If
End Sub
********************** Module1 ***************************
Option Explicit
'SW_SHOWNA
Global Const SW_SHOWNA = 8
'ShowWindow
Declare Function ShowWindow Lib "User" (ByVal hWnd As Integer, ByVal nCmdShow As Integer) As Integer
Function Intersection (FormA As Form, FormB As Form) As Integer
'this simply determines if an intersection exits between FormA and FormB
If ((FormA.Left + FormA.Width) < FormB.Left) Then
Intersection = False
ElseIf ((FormB.Left + FormB.Width) < FormA.Left) Then
Intersection = False
ElseIf ((FormA.Top + FormA.Height) < FormB.Top) Then
Intersection = False
ElseIf ((FormB.Top + FormB.Height) < FormA.Top) Then
Intersection = False
Else
Intersection = True
End If
End Function